package com.hanthink.system.service.impl.pc;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hanthink.common.core.domain.entity.SysDept;
import com.hanthink.common.exception.CustomException;
import com.hanthink.common.utils.StringUtils;
import com.hanthink.system.domain.pc.EmItemFile;
import com.hanthink.system.domain.pc.EmJobItem;
import com.hanthink.system.mapper.EmItemFileMapper;
import com.hanthink.system.mapper.EmJobItemMapper;
import com.hanthink.system.service.ISysDeptService;
import com.hanthink.system.service.impl.SysUserServiceImpl;
import com.hanthink.system.service.pc.IEmItemFileService;

/**
 * 设备点检文件Service业务层处理
 * 
 * @author hanthink
 * @date 2021-01-27
 */
@Service
public class EmItemFileServiceImpl implements IEmItemFileService {
	private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);

	@Autowired
	private EmItemFileMapper emItemFileMapper;

	@Autowired
	private ISysDeptService deptService;

	@Autowired
	private EmJobItemMapper emJobItemMapper;

	/**
	 * 查询设备点检文件
	 * 
	 * @param id 设备点检文件ID
	 * @return 设备点检文件
	 */
	@Override
	public EmItemFile selectEmItemFileById(Long id) {
		return emItemFileMapper.selectEmItemFileById(id);
	}

	/**
	 * 查询设备点检文件列表
	 * 
	 * @param emItemFile 设备点检文件
	 * @return 设备点检文件
	 */
	@Override
	public List<EmItemFile> selectEmItemFileList(EmItemFile emItemFile) {
		return emItemFileMapper.selectEmItemFileList(emItemFile);
	}

	/**
	 * 新增设备点检文件
	 * 
	 * @param emItemFile 设备点检文件
	 * @return 结果
	 */
	@Override
	public int insertEmItemFile(EmItemFile emItemFile) {
		return emItemFileMapper.insertEmItemFile(emItemFile);
	}

	/**
	 * 修改设备点检文件
	 * 
	 * @param emItemFile 设备点检文件
	 * @return 结果
	 */
	@Override
	public int updateEmItemFile(EmItemFile emItemFile) {

		// 更新任务里面点检子项信息
		emItemFileMapper.updateEmItemSelect(emItemFile);
		return emItemFileMapper.updateEmItemFile(emItemFile);
	}

	/**
	 * 批量删除设备点检文件
	 * 
	 * @param ids 需要删除的设备点检文件ID
	 * @return 结果
	 */
	@Override
	public int deleteEmItemFileByIds(Long[] ids) {
		return emItemFileMapper.deleteEmItemFileByIds(ids);
	}

	/**
	 * 删除设备点检文件信息
	 * 
	 * @param id 设备点检文件ID
	 * @return 结果
	 */
	@Override
	public int deleteEmItemFileById(Long id) {
		return emItemFileMapper.deleteEmItemFileById(id);
	}

	/**
	 * 导入数据
	 * 
	 * @param itemFileList    数据列表
	 * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
	 * @param operName        操作用户
	 * @return 结果
	 */
	@Override
	public String importemItemFile(List<EmItemFile> itemFileList, Boolean isUpdateSupport, String operName) {
		if (StringUtils.isNull(itemFileList) || itemFileList.size() == 0) {
			throw new CustomException("导入设备点检子项数据不能为空！");
		}
		int successNum = 0;
		int failureNum = 0;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder failureMsg = new StringBuilder();
		int currentRowNum = 0;
		for (EmItemFile emItemFile : itemFileList) {
			currentRowNum++;
			try {
				// 工厂匹配
				SysDept dept = new SysDept();
				dept.setDeptName(emItemFile.getSiteKey().trim());
				List<SysDept> deptList = deptService.selectDeptList(dept);
				if (deptList.size() == 0) {
					failureNum++;
					failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据工厂信息在系统中不存在，请核实");
					continue;
				}
				emItemFile.setSiteKey(deptList.get(0).getDeptId().toString());
				
				// 查询点检项信息
				boolean isReadDataBase = false;
				switch (currentRowNum) {
				case 1:
					isReadDataBase = true;
					break;
				default:
					isReadDataBase = !itemFileList.get(currentRowNum - 2).getItemCode().equals(emItemFile.getItemCode());
					break;
				}
				if (!isReadDataBase) {
					emItemFile.setItemId(itemFileList.get(currentRowNum - 2).getItemId());
				} else {
					EmJobItem emJobItem = new EmJobItem();
					emJobItem.setSiteKey(deptList.get(0).getDeptId().toString());
					emJobItem.setItemCode(emItemFile.getItemCode());
					List<EmJobItem> emJobItemList = emJobItemMapper.selectEmJobItemList(emJobItem);
					if (emJobItemList.size() == 0) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据点检项编码信息["
								+ emItemFile.getItemCode() + "]在系统中不存在，请核实");
						continue;
					}
					emItemFile.setItemId(emJobItemList.get(0).getId());
				}
				
				List<EmItemFile> items = emItemFileMapper.selectEmItemFileList(emItemFile);
				if (items.size() > 0) {
					EmItemFile p = items.get(0);
					if (StringUtils.isNull(p)) {
						this.insertEmItemFile(emItemFile);
						successNum++;
						successMsg.append("<br/>" + successNum + "、设备点检子项" + emItemFile.getSelectCode() + " 导入成功");
					} else if (isUpdateSupport) {
						emItemFile.setUpdateBy(operName);
						emItemFile.setId(p.getId());
						this.updateEmItemFile(emItemFile);
						successNum++;
						successMsg.append("<br/>" + successNum + "、设备点检子项 " + emItemFile.getSelectCode() + " 更新成功");
					}
					else {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、设备点检子项 " + emItemFile.getSelectCode() + " 已存在");
						continue;
					}
				} else {
					// 校验数据信息
					if (StringUtils.isEmpty(emItemFile.getSiteKey())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据 工厂不能为空");
						continue;
					} else if (StringUtils.isEmpty(emItemFile.getItemCode())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据任务项编码不能为空");
						continue;
					} else if (StringUtils.isEmpty(emItemFile.getSelectCode())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据选项编码不能为空");
						continue;
					} else if (StringUtils.isNull(emItemFile.getSelectDesc())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据选项名称不能为空");
						continue;
					} else if (StringUtils.isNull(emItemFile.getFileType())
							|| !StringUtils.isNumeric(emItemFile.getFileType())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据文件类型不能为空且只能数字类型");
						continue;
					} else if (StringUtils.isNull(emItemFile.getSortNum())
							|| !StringUtils.isNumeric(emItemFile.getSortNum().toString())) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据顺序不能为空且只能数字类型");
						continue;
					}

					
					// 校验
					EmItemFile em = new EmItemFile();
					em.setSelectCode(emItemFile.getSelectCode());
					em.setItemId(emItemFile.getItemId());
					List<EmItemFile> list = this.selectEmItemFileList(emItemFile);
					if (list.size() != 0) {
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、第" + currentRowNum + "行数据点检子项信息在系统中已存在，请核实");
						continue;
					}

					emItemFile.setCreateBy(operName);
					this.insertEmItemFile(emItemFile);
					successNum++;
					successMsg.append("<br/>" + successNum + "、设备点检子项 " + emItemFile.getItemCode() + " 导入成功");
				}

			} catch (Exception e) {
				failureNum++;
				String msg = "<br/>" + failureNum + "、设备点检子项" + emItemFile.getItemCode() + " 导入失败：";
				failureMsg.append(msg + e.getMessage());
				log.error(msg, e);
			}
		}
		if (failureNum > 0) {
			failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
			throw new CustomException(failureMsg.toString());
		} else {
			successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
		}
		return successMsg.toString();
	}
}
